package com.huatuo_b2b.htb2b.alipay;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;
import com.huatuo_b2b.htb2b.R;
import com.huatuo_b2b.htb2b.common.Constants;
import com.huatuo_b2b.htb2b.common.MyShopApplication;
import com.huatuo_b2b.htb2b.http.RemoteDataHandler;
import com.huatuo_b2b.htb2b.http.ResponseData;

import org.apache.http.HttpStatus;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;

public class PayDemoActivity extends FragmentActivity {

    // 商户PID
    public static final String PARTNER = "2088121855294283";//"2088901116678243";//
    // 商户收款账号
    public static final String SELLER = "postmaster@htyyao.com";//"htyfscb@huatuoyf.com";//
    // 商户私钥，pkcs8格式
    public static final String RSA_PRIVATE =
            "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALBKQvxeJ+JDSU78TuwMeh0glVHXwpiF+6LK46GgyWahjEuyImMIHqccYa/KnhMQlVHV4Tp+h9QJhiIPlMdRvKhlgBaFkXssNrx6QREOT5+AIhnVOrnOXP+D6aVhiqvGPffdgIPoqVnuMJkvYAD56zX/SH8fwweszWgvi8/EWZwbAgMBAAECgYEArzeAULl8xsS97kWUY8Ua8ixafVgHz/ULYIhrq0/WHa3fdbT9vJRrcwkghsrKRoSrBQWhsLPmaPd2XBBEfb9d1BHyrE5s8IFTzZpCYx+sBhmrWHwknJsDyLFWZqdQqgSigVZ/X8Z/TD7s5HeB9Xy0HHeyQY/YDXJsubdm964ipSECQQDn5XeFJjWil33BGyVt3rieBQ6GY6uJEEMH4HlmKZpO2Uskaa94gViunFJcDGd2d8LxiespFgvaT0+/MtI29NeDAkEAwp0qtIQFFSXbEihP9l9Z0x5JFWSlpwZHPKGA0Y67H9wQXP7xBrsHFGwK4buSKVvJF7NVOQiI3Uq2adIo2ZrtiQJAFVC6U7rXY0KZhI6COj8mqR+93gx7T/X2s1qmzgU08dp3VbmBL4p0JFiqGVvqhrErchhDTVuBa2eu5Nw/Bl4rEQJAcLei8ma8ouEIH14l4iab2gFihveCUlj6jY1lFPq8Otm0yIgIhcNxeEyTiOag4z98GzQNGjltO+539JZ6fn6TMQJABcH+yvKdSSCtBwM3xdgrSoN6yPR1tBuorywaHx/VlRVuFuNJtzv4lRpZcfDDSU+TvfKRW9xVCDJW2/ee9VrPYg==";


    // 支付宝公钥
    public static final String RSA_PUBLIC =
            "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwSkL8XifiQ0lO/E7sDHodIJVR\n" +
                    "18KYhfuiyuOhoMlmoYxLsiJjCB6nHGGvyp4TEJVR1eE6fofUCYYiD5THUbyoZYAW\n" +
                    "hZF7LDa8ekERDk+fgCIZ1Tq5zlz/g+mlYYqrxj333YCD6KlZ7jCZL2AA+es1/0h/\n" +
                    "H8MHrM1oL4vPxFmcGwIDAQAB";

    private static final int SDK_PAY_FLAG = 1;
    private static final int SDK_CHECK_FLAG = 2;
    private int result_state = 3;//mode: 0成功   1正在支付   2支付失败
    private MyShopApplication myApplication;
    private String pay_sn;

    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    PayResult payResult = new PayResult((String) msg.obj);
                    /**
                     * 同步返回的结果必须放置到服务端进行验证（验证的规则请看https://doc.open.alipay.com/doc2/
                     * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                     * docType=1) 建议商户依赖异步通知
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息

                    String resultStatus = payResult.getResultStatus();

                    System.out.println("########################resultStatus:" + resultStatus);


                    // 判断resultStatus 为“9000”则代表支付成功，具体状态码代表含义可参考接口文档
                    if (TextUtils.equals(resultStatus, "9000")) {
                        //Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                        paySucced();
                    } else {
                        // 判断resultStatus 为非"9000"则代表可能支付失败
                        // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
                        if (TextUtils.equals(resultStatus, "8000")) {
                            // Toast.makeText(PayDemoActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
                            result_state = 1;
                            ShowDialog("支付结果确认中,请稍等片刻!");
                        } else {
                            // 其他值就可以判断为支付失败，包括用户主动取消支付，或者系统返回的错误
//                            Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
//                            finish();
//                            liubw
                            result_state = 2;
                            ShowDialog("支付失败，请稍后再试!");
                        }
                    }
                    break;
                }
                case SDK_CHECK_FLAG: {
                    Toast.makeText(PayDemoActivity.this, "检查结果为：" + msg.obj, Toast.LENGTH_SHORT).show();
                    break;
                }
                default:
                    break;
            }
        }

        ;
    };


    /**
     * 收藏删除
     *
     * @param :fav_id 商品ID
     * @param :key    登录标识
     */
    public void paySucced() {
        String url = Constants.URL_PAYFOR_SUCCES;

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("pay_sn", pay_sn);

        System.out.println("##########################url:" + url);

        RemoteDataHandler.asyncLoginPostDataString(url, params, myApplication, new RemoteDataHandler.Callback() {
            @Override
            public void dataLoaded(ResponseData data) {
                if (data.getCode() == HttpStatus.SC_OK) {
                    String json = data.getJson();

//                    System.out.println("##########################data:"+ data);
//                    System.out.println("##########################json:"+ json);
                    if (json.equals("success")) {

                        result_state = 0;
                        ShowDialog("支付成功");
                    }
                } else {
//					Toast.makeText(GoodsDetailsActivity.this, getString(R.string.datas_loading_fail_prompt), Toast.LENGTH_SHORT).show();;
                }
            }
        });
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.payment_lib_view);
        myApplication = (MyShopApplication) getApplicationContext();

        pay_sn = getIntent().getStringExtra("pay_sn");//"430507745359431059";
//        String order_sn = getIntent().getExtras().getString("order_sn");//"8000000000020801";
        String order_price = getIntent().getExtras().getString("order_price");//"8000000000020801";

//        System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
//        System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
//        System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
//        System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
//        System.out.println("pay_sn:"+pay_sn);
//        System.out.println("order_price:"+ order_price);


        pay("实物订单_" + pay_sn, pay_sn, order_price, pay_sn);
    }

    /**
     * call alipay sdk pay. 调用SDK支付
     */
    public void pay(final String subject, final String body, final String price, final String order_sn) {
        if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {
            new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialoginterface, int i) {
                            //
                            finish();
                        }
                    }).show();
            return;
        }

        String orderInfo = getOrderInfo(subject, body, price, order_sn);

        /**
         * 特别注意，这里的签名逻辑需要放在服务端，切勿将私钥泄露在代码中！
         */
        String sign = sign(orderInfo);

        try {
            /**
             * 仅需对sign 做URL编码
             */
            sign = URLEncoder.encode(sign, "UTF-8");

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        /**
         * 完整的符合支付宝参数规范的订单信息
         */
        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask(PayDemoActivity.this);
                // 调用支付接口，获取支付结果

                System.out.println("payInfo:" + payInfo);
                String result = alipay.pay(payInfo, true);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    /**
     * check whether the device has authentication alipay account.
     * 查询终端设备是否存在支付宝认证账户
     */
    public void check(View v) {
        Runnable checkRunnable = new Runnable() {
            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask payTask = new PayTask(PayDemoActivity.this);
                // 调用查询接口，获取查询结果
                boolean isExist = payTask.checkAccountIfExist();

                Message msg = new Message();
                msg.what = SDK_CHECK_FLAG;
                msg.obj = isExist;
                mHandler.sendMessage(msg);
            }
        };

        Thread checkThread = new Thread(checkRunnable);
        checkThread.start();

    }

    /**
     * get the sdk version. 获取SDK版本号
     */
    public void getSDKVersion() {
        PayTask payTask = new PayTask(this);
        String version = payTask.getVersion();
        Toast.makeText(this, version, Toast.LENGTH_SHORT).show();
    }

    /**
     * 原生的H5（手机网页版支付切natvie支付） 【对应页面网页支付按钮】
     *
     * @param v
     */
    public void h5Pay(View v) {
        Intent intent = new Intent(this, H5PayDemoActivity.class);
        Bundle extras = new Bundle();
        /**
         * url是测试的网站，在app内部打开页面是基于webview打开的，demo中的webview是H5PayDemoActivity，
         * demo中拦截url进行支付的逻辑是在H5PayDemoActivity中shouldOverrideUrlLoading方法实现，
         * 商户可以根据自己的需求来实现
         */
        String url = "http://m.taobao.com";
        // url可以是一号店或者美团等第三方的购物wap站点，在该网站的支付过程中，支付宝sdk完成拦截支付
        extras.putString("url", url);
        intent.putExtras(extras);
        startActivity(intent);

    }

    /**
     * create the order info. 创建订单信息
     */
    private String getOrderInfo(String subject, String body, String price, String order_sn) {

        // 签约合作者身份ID
        String orderInfo = "partner=" + "\"" + PARTNER + "\"";

        // 签约卖家支付宝账号
        orderInfo += "&seller_id=" + "\"" + SELLER + "\"";

        // 商户网站唯一订单号
        orderInfo += "&out_trade_no=" + "\"" + order_sn + "\"";

        // 商品名称
        orderInfo += "&subject=" + "\"" + subject + "\"";

        // 商品详情
        orderInfo += "&body=" + "\"" + body + "\"";

        // 商品金额
        orderInfo += "&total_fee=" + "\"" + price + "\"";

        // 服务器异步通知页面路径
        orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\"";

        // 服务接口名称， 固定值
        orderInfo += "&service=\"mobile.securitypay.pay\"";

        // 支付类型， 固定值
        orderInfo += "&payment_type=\"1\"";

        // 参数编码， 固定值
        orderInfo += "&_input_charset=\"utf-8\"";

        // 设置未付款交易的超时时间
        // 默认30分钟，一旦超时，该笔交易就会自动被关闭。
        // 取值范围：1m～15d。
        // m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
        // 该参数数值不接受小数点，如1.5h，可转换为90m。
        orderInfo += "&it_b_pay=\"30m\"";

        // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
        // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

        // 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
        orderInfo += "&return_url=\"m.alipay.com\"";

        // 调用银行卡支付，需配置此参数，参与签名， 固定值 （需要签约《无线银行卡快捷支付》才能使用）
        // orderInfo += "&paymethod=\"expressGateway\"";

        System.out.println("@@@@@@@@@@@@@@@@@@@orderInfo: " + orderInfo);
        return orderInfo;
    }

/*    *//**
     * get the out_trade_no for an order. 生成商户订单号，该值在商户端应保持唯一（可自定义格式规范）
     *//*
    private String getOutTradeNo() {
        SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
        Date date = new Date();
        String key = format.format(date);

        Random r = new Random();
        key = key + r.nextInt();
        key = key.substring(0, 15);
        return key;
    }*/

    /**
     * sign the order info. 对订单信息进行签名
     *
     * @param content 待签名订单信息
     */
    private String sign(String content) {
        return SignUtils.sign(content, RSA_PRIVATE);
    }

    /**
     * get the sign type we use. 获取签名方式
     */
    private String getSignType() {
        return "sign_type=\"RSA\"";
    }


    //弹出提示框1
    private void ShowDialog(String title) {
        new AlertDialog.Builder(this)
                .setTitle("提示信息")//弹出窗口的最上头文字
                        // .setIcon(R.mipmap.ic_dialog_icon)// 设置弹出窗口的图式
                .setMessage(title)//设置弹出窗口的信息

                .setPositiveButton("继续购物",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialoginterface, int i) {
                                if (result_state == 2) {
                                    Intent intent = new Intent();
                                    setResult(RESULT_OK, intent);
                                }

                                finish();/* 关闭窗口 */
                            }
                        })

                        //设置弹出窗口的返回事件
                .setNegativeButton("取消",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialoginterface, int i) {
//                                Intent intent = new Intent(Settings.ACTION_APN_SETTINGS);//系统设置界面
//                                startActivity(intent);
                                finish();
                            }
                        }).show();
    }

}